import def from "./def";
import defineReactive from "./defineReactive";
import observe from './observe'
import { arrayMethods } from "./array";
/**
 * Observer：将一个正常的object转换成每个层级的属性都是响应式的object
 */
export default class Observer {
  constructor(obj) {
    def(obj, '__ob__', this, false)
    // __ob__的作用是标记这个对象是否转换成响应式数据了，可以通过obj.__ob__ 来获取Observer对象

    if(Array.isArray(obj)) { 
      // 将数组的原型指向重写的原型
      // obj.__proto__ = arrayMethods
      Object.setPrototypeOf(obj, arrayMethods) 
      // 对数组中的元素进行响应式处理

      this.observeArray(obj)
    } else {
      this.walk(obj)
    }
  }
  walk(obj) { 
    for (const key in obj) {
      defineReactive(obj, key)
    }
  }
  observeArray(arr) {
    for(let i = 0; i < arr.length; i++) {
      observe(arr[i])
    } 
  }
}